import sys
from google.colab import drive
drive.mount('/content/drive/')
Drive already mounted at /content/drive/; to attempt to forcibly remount, call drive.mount("/content/drive/", force_remount=True).
import sys
sys.path.append('/content/drive/MyDrive/final')
gpu_info = !nvidia-smi
gpu_info = '\n'.join(gpu_info)
if gpu_info.find('failed') >= 0:
print('Not connected to a GPU')
else:
print(gpu_info)
Wed Dec 8 16:33:13 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 495.44 Driver Version: 460.32.03 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla P100-PCIE... Off | 00000000:00:04.0 Off | 0 |
| N/A 58C P0 42W / 250W | 8767MiB / 16280MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
#pip install visualization
pip install tensorflow
Requirement already satisfied: tensorflow in /usr/local/lib/python3.7/dist-packages (2.7.0) Requirement already satisfied: absl-py>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (0.12.0) Requirement already satisfied: astunparse>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (1.6.3) Requirement already satisfied: gast<0.5.0,>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (0.4.0) Requirement already satisfied: six>=1.12.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (1.15.0) Requirement already satisfied: wrapt>=1.11.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (1.13.3) Requirement already satisfied: flatbuffers<3.0,>=1.12 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (2.0) Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (0.22.0) Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (1.1.0) Requirement already satisfied: libclang>=9.0.1 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (12.0.0) Requirement already satisfied: typing-extensions>=3.6.6 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (3.10.0.2) Requirement already satisfied: keras-preprocessing>=1.1.1 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (1.1.2) Requirement already satisfied: tensorboard~=2.6 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (2.7.0) Requirement already satisfied: wheel<1.0,>=0.32.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (0.37.0) Requirement already satisfied: h5py>=2.9.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (3.1.0) Requirement already satisfied: grpcio<2.0,>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (1.42.0) Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (3.3.0) Requirement already satisfied: numpy>=1.14.5 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (1.19.5) Requirement already satisfied: keras<2.8,>=2.7.0rc0 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (2.7.0) Requirement already satisfied: tensorflow-estimator<2.8,~=2.7.0rc0 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (2.7.0) Requirement already satisfied: protobuf>=3.9.2 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (3.17.3) Requirement already satisfied: google-pasta>=0.1.1 in /usr/local/lib/python3.7/dist-packages (from tensorflow) (0.2.0) Requirement already satisfied: cached-property in /usr/local/lib/python3.7/dist-packages (from h5py>=2.9.0->tensorflow) (1.5.2) Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.6->tensorflow) (0.6.1) Requirement already satisfied: google-auth<3,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.6->tensorflow) (1.35.0) Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.6->tensorflow) (57.4.0) Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.6->tensorflow) (0.4.6) Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.6->tensorflow) (1.8.0) Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.6->tensorflow) (3.3.6) Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.6->tensorflow) (2.23.0) Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.6->tensorflow) (1.0.1) Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.7/dist-packages (from google-auth<3,>=1.6.3->tensorboard~=2.6->tensorflow) (4.8) Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<3,>=1.6.3->tensorboard~=2.6->tensorflow) (0.2.8) Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<3,>=1.6.3->tensorboard~=2.6->tensorflow) (4.2.4) Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.6->tensorflow) (1.3.0) Requirement already satisfied: importlib-metadata>=4.4 in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard~=2.6->tensorflow) (4.8.2) Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=4.4->markdown>=2.6.8->tensorboard~=2.6->tensorflow) (3.6.0) Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard~=2.6->tensorflow) (0.4.8) Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard~=2.6->tensorflow) (3.0.4) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard~=2.6->tensorflow) (2021.10.8) Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard~=2.6->tensorflow) (2.10) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard~=2.6->tensorflow) (1.24.3) Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.6->tensorflow) (3.1.1)
import csv
import json
import os
from PIL import Image
import pprint
import re
import copy
import skimage.draw
import visualize
import utils as my_utils
import matplotlib.pyplot as plt
import cv2
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
from tensorflow.keras.optimizers import Adam
from IPython.display import clear_output
# global context variables
segmentation_path = '/content/drive/MyDrive/final/data/segmentation_masks' # a folder of annotation files
img_path = '/content/drive/MyDrive/final/data/images' # a folder of image files
class img_meta:
# img_name: image file name
# annotations: the annotation list
def __str__(self):
return 'img_name: ' + self.img_name + ', mask_name: \n' + self.mask_name
def __repr__(self):
return 'img_name: ' + self.img_name + ', mask_name: \n' + self.mask_name
def process(self, img_name, segmentation_path):
self.img_name = img_name
img_tokens = img_name.strip('.png')
img_tokens = img_tokens.split('_')
#print(img_tokens)
img_key = img_tokens[0]
img_name_key = img_tokens[1]
# print(f"Image name_key: {img_name_key}")
# print(f"Image key: {img_key}")
# Check all segmentation masks
mask_files = os.listdir(segmentation_path)
for file in mask_files:
file_copy = copy.deepcopy(file)
file_copy = re.sub(r"\.[0-9]", "", file_copy)
mask_tokens = file_copy.split('_')
#print( mask_tokens)
mask_name_key = mask_tokens[0]
#print(mask_name_key)
for token in mask_tokens:
if len(token)<=2:
mask_key = token
break
# print("Mask Key: ", mask_key)
if img_key == mask_key:
self.mask_name = file
break
#This function uses opencv rather than PIL to load image.
def load_image(self):
img_file_path = os.path.join(img_path, self.img_name)
"""Load the specified image and return a [H,W,3] Numpy array.
"""
# Load image
image = cv2.imread(img_file_path)
# If grayscale. Convert to RGB for consistency.
if image.ndim != 3:
image = skimage.color.gray2rgb(image)
# If has an alpha channel, remove it for consistency
if image.shape[-1] == 4:
image = image[..., :3]
return image
def load_mask(self):
mask_file_path = os.path.join(segmentation_path, self.mask_name)
# Load mask
mask = cv2.imread(mask_file_path, cv2.IMREAD_GRAYSCALE)
# Normalize mask between (0-1)
mask = np.where(mask>0, 1, 0)
return mask
img_metas = []
for file in os.listdir(img_path):
if file.endswith('.png'):
print('Processing', file, '...')
img_meta_obj = img_meta()
img_meta_obj.process(file, segmentation_path)
img_metas.append(img_meta_obj)
else:
print('[WARNING] Non-image file detected:', file)
Processing 3_akulasaisanjay.png ... Processing 1_ahsanmuhammad.png ... Processing 3_anandankit.png ... Processing 4_anandankit.png ... Processing 1_pandirinikhilkumar.png ... Processing 5_peddinenigowtham.png ... Processing 5_patipravasini.png ... Processing 4_patipravasini.png ... Processing 1_adhikarisaugat.png ... Processing 2_ahsanmuhammad.png ... Processing 2_akulasaisanjay.png ... Processing 5_jammulavathsal.png ... Processing 11_bachamollaharshavardhanreddy.png ... Processing 16_bonuvarshinireddy.png ... Processing 7_atlachandrasekharreddy.png ... Processing 11_rajakvarunraju.png ... Processing 16_rayallavineethabhavya.png ... Processing 10_bachamollaharshavardhanreddy.png ... Processing 8_atlachandrasekharreddy.png ... Processing 6_peddinenigowtham.png ... Processing 12_rajakvarunraju.png ... Processing 11_rabbyshahariar.png ... Processing 17_lakkireddybrunda.png ... Processing 15_bonuvarshinireddy.png ... Processing 6_anwarmuhammadjunaid.png ... Processing 14_kongarachanikya.png ... Processing 18_sahapratim.png ... Processing 17_runjalasunithaglory.png ... Processing 15_rayallavineethabhavya.png ... Processing 13_kollasaividwan.png ... Processing 11_karnasaimanishreddy.png ... Processing 10_kanugovimahidhar.png ... Processing 7_anwarmuhammadjunaid.png ... Processing 10_rabbyshahariar.png ... Processing 18_bungmahesh.png ... Processing 12_keshidianudeep.png ... Processing 18_runjalasunithaglory.png ... Processing 6_junnuthulapranayreddy.png ... Processing 19_bungmahesh.png ... Processing 24_chikkalasaikiran.png ... Processing 34_duddukurileelakrishna.png ... Processing 21_seelamsumanthkumarreddy.png ... Processing 21_chaudharyamitlakshmikant.png ... Processing 21_cheniminenihemanthi.png ... Processing 27_dasarkadeep.png ... Processing 22_shakerbilawal.png ... Processing 34_valasanivenugopal.png ... Processing 30_divvelapraveen.png ... Processing 21_shakerbilawal.png ... Processing 34_dykenlandon.png ... Processing 26_dantuluripretham.png ... Processing 27_dantuluripretham.png ... Processing 25_chintamvamsikrishna.png ... Processing 35_dykenlandon.png ... Processing 28_dasarkadeep.png ... Processing 22_cheniminenihemanthi.png ... Processing 20_lewisseth.png ... Processing 33_duddukurileelakrishna.png ... Processing 24_chintamvamsikrishna.png ... Processing 33_valasanivenugopal.png ... Processing 20_seelamsumanthkumarreddy.png ... Processing 20_chaudharyamitlakshmikant.png ... Processing 19_sahapratim.png ... Processing 23_chikkalasaikiran.png ... Processing 48_pandirinikhilkumar.png ... Processing 48_adhikarisaugat.png ... Processing 44_guragainbijay.png ... Processing 44_gundlapallybhanuteja.png ... Processing 36_vodapallikalyani.png ... Processing 40_goturisaikarthikreddy.png ... Processing 52_patipravasini.png ... Processing 39_gorantlasaikrishnavarma.png ... Processing 41_olajideemmanuelolamide.png ... Processing 53_jammulavathsal.png ... Processing 49_ahsanmuhammad.png ... Processing 46_pampanaaditya.png ... Processing 45_guragainbijay.png ... Processing 39_goturisaikarthikreddy.png ... Processing 51_anandankit.png ... Processing 43_pagarepranav.png ... Processing 43_gundlapallybhanuteja.png ... Processing 42_gundebommualekhya.png ... Processing 38_wadoodhamid.png ... Processing 47_indukurisubhavarshitha.png ... Processing 47_panchalsagarlaxmikant.png ... Processing 48_indukurisubhavarshitha.png ... Processing 43_gundebommualekhya.png ... Processing 36_gajamcharantej.png ... Processing 52_jammulavathsal.png ... Processing 38_gorantlasaikrishnavarma.png ... Processing 50_akulasaisanjay.png ... Processing 59_rajakvarunraju.png ... Processing 63_bonuvarshinireddy.png ... Processing 58_karnasaimanishreddy.png ... Processing 60_keshidianudeep.png ... Processing 62_kongarachanikya.png ... Processing 59_keshidianudeep.png ... Processing 65_lakkireddybrunda.png ... Processing 58_rabbyshahariar.png ... Processing 64_lakkireddybrunda.png ... Processing 57_kanugovimahidhar.png ... Processing 58_bachamollaharshavardhanreddy.png ... Processing 66_bungmahesh.png ... Processing 65_runjalasunithaglory.png ... Processing 61_kollasaividwan.png ... Processing 53_junnuthulapranayreddy.png ... Processing 58_kanugovimahidhar.png ... Processing 60_kollasaividwan.png ... Processing 67_lewisseth.png ... Processing 66_sahapratim.png ... Processing 61_kongarachanikya.png ... Processing 55_atlachandrasekharreddy.png ... Processing 59_karnasaimanishreddy.png ... Processing 53_peddinenigowtham.png ... Processing 63_rayallavineethabhavya.png ... Processing 81_duddukurileelakrishna.png ... Processing 69_cheniminenihemanthi.png ... Processing 68_lokahrishikeshreddy.png ... Processing 74_mallempallicharankumar.png ... Processing 87_goturisaikarthikreddy.png ... Processing 75_mallempallicharankumar.png ... Processing 69_lokahrishikeshreddy.png ... Processing 84_gajamcharantej.png ... Processing 76_dayanasri.png ... Processing 68_seelamsumanthkumarreddy.png ... Processing 85_wadoodhamid.png ... Processing 69_shakerbilawal.png ... Processing 86_gorantlasaikrishnavarma.png ... Processing 82_dykenlandon.png ... Processing 81_valasanivenugopal.png ... Processing 84_vodapallikalyani.png ... Processing 72_chintamvamsikrishna.png ... Processing 71_chikkalasaikiran.png ... Processing 68_lewisseth.png ... Processing 68_chaudharyamitlakshmikant.png ... Processing 74_dantuluripretham.png ... Processing 83_nadimpallisriramakesavaakhilvarma.png ... Processing 95_adhikarisaugat.png ... Processing 95_indukurisubhavarshitha.png ... Processing 92_guragainbijay.png ... Processing 91_gundlapallybhanuteja.png ... Processing 89_olajideemmanuelolamide.png ... Processing 94_pampanaaditya.png ... Processing 90_pagarepranav.png ... Processing 90_gundebommualekhya.png ... Processing 88_oladriarchana.png ... Processing 88_olajideemmanuelolamide.png ... Processing 93_pampanaaditya.png ... Processing 91_pagarepranav.png ... Processing 95_pandirinikhilkumar.png ...
print(len(img_metas))
img_meta_obj = img_metas[1]
print(img_meta_obj)
150 img_name: 1_ahsanmuhammad.png, mask_name: ahsanmuhammad_6028238_67421715_1_segment_mask-3.png
img_obj = img_meta_obj.load_image()
print(img_obj.shape)
visualize.display_images([img_obj])
(387, 362, 3)
# Visualize a random file
colors = visualize.random_colors(5)
color = colors[0]
#sample_idx = np.random.choice(len(img_metas))
sample_idx = 1
print("Sample Index: ", sample_idx)
#Image Meta Data
img_meta_obj = img_metas[sample_idx]
img_file = img_meta_obj.load_image()
print("Image shape: ", img_file.shape)
mask = img_meta_obj.load_mask()
print("Mask shape: ", mask.shape)
Sample Index: 1 Image shape: (387, 362, 3) Mask shape: (387, 362)
masked_image = visualize.apply_mask(img_file, mask, color)
visualize.display_images([masked_image])
# Image size that we are going to use
IMG_SIZE = 256
# Our images are RGB (3 channels)
N_CHANNELS = 3
# Foreground and backgroung
N_CLASSES = 2
#Loads the data and creates a tuple of images
#masks to be later made into Tensorflow data object
def dataLoader():
img_list = []
mask_list = []
for i in range(len(img_metas)):
img_meta_obj = img_metas[i]
img_file = img_meta_obj.load_image()
#print("Image shape: ", img_file.shape)
#Convert mask to the shape of an image (3D) with channel=1
mask = img_meta_obj.load_mask()
mask = np.expand_dims(mask, axis =-1)
#Rezize mask and image to common size
# Resize Image to 256x256
img_file, _, scale, padding,_ = my_utils.resize_image(img_file, max_dim = IMG_SIZE, mode="square")
#print("Image shape: ", img_file.shape)
# Resize Mask to 256x256
mask = my_utils.resize_mask(mask, scale, padding)
#Fix Overlap bug
mask = np.where(mask > 0, 1, 0)
mask = mask.astype(np.float32)
#print(np.amax(mask))
#print("Mask shape: ", mask.shape)
#Normalize Image
img_file = img_file.astype(np.float32)
img_file = img_file/255.0
#print("Image shape: ", img_file.shape)
img_list.append(img_file)
mask_list.append(mask)
return (img_list, mask_list)
dataset = tf.data.Dataset.from_tensor_slices(dataLoader())
train_size = int(0.9 * len(img_metas))
val_size = int(0.1 * len(img_metas))
train_dataset = dataset.take(train_size)
val_dataset = dataset.skip(train_size)
BATCH_SIZE = 5
BUFFER_SIZE = 1000
# important for reproducibility
# this allows to generate the same random numbers
SEED = 42
AUTOTUNE = tf.data.experimental.AUTOTUNE
dataset = {"train": train_dataset, "val": val_dataset}
# -- Train Dataset --#
#dataset['train'] = dataset['train'].shuffle(buffer_size=BUFFER_SIZE, seed=SEED)
dataset['train'] = dataset['train'].repeat()
dataset['train'] = dataset['train'].batch(BATCH_SIZE)
dataset['train'] = dataset['train'].prefetch(buffer_size=AUTOTUNE)
#-- Validation Dataset --#
dataset['val'] = dataset['val'].repeat()
dataset['val'] = dataset['val'].batch(BATCH_SIZE)
dataset['val'] = dataset['val'].prefetch(buffer_size=AUTOTUNE)
print(dataset['train'])
print(dataset['val'])
# how shuffle works: https://stackoverflow.com/a/53517848
<PrefetchDataset shapes: ((None, 256, 256, 3), (None, 256, 256, 1)), types: (tf.float32, tf.float32)> <PrefetchDataset shapes: ((None, 256, 256, 3), (None, 256, 256, 1)), types: (tf.float32, tf.float32)>
def display_sample(display_list):
"""Show side-by-side an input image,
the ground truth and the prediction.
"""
plt.figure(figsize=(18, 18))
title = ['Input Image', 'True Mask', 'Predicted Mask']
for i in range(len(display_list)):
plt.subplot(1, len(display_list), i+1)
plt.title(title[i])
plt.imshow(tf.keras.preprocessing.image.array_to_img(display_list[i]))
plt.axis('off')
plt.show()
for image, mask in dataset['train'].take(1):
sample_image, sample_mask = image, mask
display_sample([sample_image[1], sample_mask[1]])
# -- Keras Functional API -- #
# -- UNet Implementation -- #
# Everything here is from tensorflow.keras.layers
# I imported tensorflow.keras.layers * to make it easier to read
dropout_rate = 0.5
input_size = (IMG_SIZE, IMG_SIZE, N_CHANNELS)
# If you want to know more about why we are using `he_normal`:
# https://stats.stackexchange.com/questions/319323/whats-the-difference-between-variance-scaling-initializer-and-xavier-initialize/319849#319849
# Or the excelent fastai course:
# https://github.com/fastai/course-v3/blob/master/nbs/dl2/02b_initializing.ipynb
initializer = 'he_normal'
# -- Encoder -- #
# Block encoder 1
inputs = Input(shape=input_size)
conv_enc_1 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer=initializer)(inputs)
conv_enc_1 = Conv2D(64, 3, activation = 'relu', padding='same', kernel_initializer=initializer)(conv_enc_1)
# Block encoder 2
max_pool_enc_2 = MaxPooling2D(pool_size=(2, 2))(conv_enc_1)
conv_enc_2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(max_pool_enc_2)
conv_enc_2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(conv_enc_2)
# Block encoder 3
max_pool_enc_3 = MaxPooling2D(pool_size=(2, 2))(conv_enc_2)
conv_enc_3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(max_pool_enc_3)
conv_enc_3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(conv_enc_3)
# Block encoder 4
max_pool_enc_4 = MaxPooling2D(pool_size=(2, 2))(conv_enc_3)
conv_enc_4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(max_pool_enc_4)
conv_enc_4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(conv_enc_4)
# -- Encoder -- #
# ----------- #
maxpool = MaxPooling2D(pool_size=(2, 2))(conv_enc_4)
conv = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(maxpool)
conv = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(conv)
# ----------- #
# -- Decoder -- #
# Block decoder 1
up_dec_1 = Conv2D(512, 2, activation = 'relu', padding = 'same', kernel_initializer = initializer)(UpSampling2D(size = (2,2))(conv))
merge_dec_1 = concatenate([conv_enc_4, up_dec_1], axis = 3)
conv_dec_1 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(merge_dec_1)
conv_dec_1 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(conv_dec_1)
# Block decoder 2
up_dec_2 = Conv2D(256, 2, activation = 'relu', padding = 'same', kernel_initializer = initializer)(UpSampling2D(size = (2,2))(conv_dec_1))
merge_dec_2 = concatenate([conv_enc_3, up_dec_2], axis = 3)
conv_dec_2 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(merge_dec_2)
conv_dec_2 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(conv_dec_2)
# Block decoder 3
up_dec_3 = Conv2D(128, 2, activation = 'relu', padding = 'same', kernel_initializer = initializer)(UpSampling2D(size = (2,2))(conv_dec_2))
merge_dec_3 = concatenate([conv_enc_2, up_dec_3], axis = 3)
conv_dec_3 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(merge_dec_3)
conv_dec_3 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(conv_dec_3)
# Block decoder 4
up_dec_4 = Conv2D(64, 2, activation = 'relu', padding = 'same', kernel_initializer = initializer)(UpSampling2D(size = (2,2))(conv_dec_3))
merge_dec_4 = concatenate([conv_enc_1, up_dec_4], axis = 3)
conv_dec_4 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(merge_dec_4)
conv_dec_4 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(conv_dec_4)
conv_dec_4 = Conv2D(2, 3, activation = 'relu', padding = 'same', kernel_initializer = initializer)(conv_dec_4)
# -- Decoder -- #
output = Conv2D(N_CLASSES, 1, activation = 'softmax')(conv_dec_4)
#This class will automatically save TF models
#at Epoch which are multiples of the SAVE_MULTIPLE parameter.
SAVE_MULTIPLE = 5
class ModelSaver(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if (epoch)%SAVE_MULTIPLE == 0: # Save when epochs are multiples of SAVE_MULTIPLE.
self.model.save(f"/content/drive/MyDrive/final/saved_models_Unet/model_{epoch}.h5")
https://lars76.github.io/2018/09/27/loss-functions-for-segmentation.html
def dice_loss(y_true, y_pred):
y_true = tf.cast(y_true, tf.float32)
y_pred = tf.math.sigmoid(y_pred)
numerator = 2 * tf.reduce_sum(y_true * y_pred)
denominator = tf.reduce_sum(y_true + y_pred)
return 1 - numerator / denominator
model = tf.keras.Model(inputs = inputs, outputs = output)
model.compile(optimizer=Adam(learning_rate=0.000001), loss = tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
# model.compile(optimizer = Adam(learning_rate=0.000001),
# loss = dice_loss,
# metrics=['accuracy'])
# create and use callback:
saver = ModelSaver()
EPOCHS = 300
STEPS_PER_EPOCH = train_size // BATCH_SIZE
VALIDATION_STEPS = val_size // BATCH_SIZE
# sometimes it can be very interesting to run some batches on cpu
# because the tracing is way better than on GPU
# you will have more obvious error message
# but in our case, it takes A LOT of time
# #On CPU
# with tf.device("/cpu:0"):
# model_history = model.fit(dataset['train'], epochs=EPOCHS,
# callbacks=[saver],
# steps_per_epoch=STEPS_PER_EPOCH,
# validation_steps=VALIDATION_STEPS,
# validation_data=dataset['val'])
# #On GPU
model_history = model.fit(dataset['train'], epochs=EPOCHS,
callbacks=[saver],
steps_per_epoch=STEPS_PER_EPOCH,
validation_steps=VALIDATION_STEPS,
validation_data=dataset['val'])
Epoch 1/300 6/27 [=====>........................] - ETA: 3s - loss: 0.8748 - accuracy: 0.0601WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0686s vs `on_train_batch_end` time: 0.1161s). Check your callbacks. 27/27 [==============================] - 8s 255ms/step - loss: 0.5601 - accuracy: 0.6215 - val_loss: 0.2627 - val_accuracy: 0.9328 Epoch 2/300 27/27 [==============================] - 5s 195ms/step - loss: 0.2130 - accuracy: 0.9438 - val_loss: 0.1558 - val_accuracy: 0.9601 Epoch 3/300 27/27 [==============================] - 5s 195ms/step - loss: 0.1543 - accuracy: 0.9575 - val_loss: 0.1278 - val_accuracy: 0.9660 Epoch 4/300 27/27 [==============================] - 5s 195ms/step - loss: 0.1342 - accuracy: 0.9614 - val_loss: 0.1150 - val_accuracy: 0.9700 Epoch 5/300 27/27 [==============================] - 5s 195ms/step - loss: 0.1224 - accuracy: 0.9641 - val_loss: 0.1061 - val_accuracy: 0.9716 Epoch 6/300 27/27 [==============================] - 7s 244ms/step - loss: 0.1133 - accuracy: 0.9648 - val_loss: 0.0994 - val_accuracy: 0.9723 Epoch 7/300 27/27 [==============================] - 5s 195ms/step - loss: 0.1054 - accuracy: 0.9651 - val_loss: 0.0935 - val_accuracy: 0.9726 Epoch 8/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0982 - accuracy: 0.9659 - val_loss: 0.0882 - val_accuracy: 0.9728 Epoch 9/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0919 - accuracy: 0.9681 - val_loss: 0.0838 - val_accuracy: 0.9742 Epoch 10/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0867 - accuracy: 0.9709 - val_loss: 0.0800 - val_accuracy: 0.9760 Epoch 11/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0822 - accuracy: 0.9741 - val_loss: 0.0766 - val_accuracy: 0.9778 Epoch 12/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0780 - accuracy: 0.9759 - val_loss: 0.0734 - val_accuracy: 0.9788 Epoch 13/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0742 - accuracy: 0.9773 - val_loss: 0.0704 - val_accuracy: 0.9798 Epoch 14/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0711 - accuracy: 0.9782 - val_loss: 0.0680 - val_accuracy: 0.9802 Epoch 15/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0683 - accuracy: 0.9789 - val_loss: 0.0659 - val_accuracy: 0.9805 Epoch 16/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0658 - accuracy: 0.9796 - val_loss: 0.0640 - val_accuracy: 0.9808 Epoch 17/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0636 - accuracy: 0.9802 - val_loss: 0.0622 - val_accuracy: 0.9810 Epoch 18/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0615 - accuracy: 0.9809 - val_loss: 0.0604 - val_accuracy: 0.9812 Epoch 19/300 27/27 [==============================] - 5s 197ms/step - loss: 0.0595 - accuracy: 0.9813 - val_loss: 0.0588 - val_accuracy: 0.9814 Epoch 20/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0578 - accuracy: 0.9818 - val_loss: 0.0574 - val_accuracy: 0.9816 Epoch 21/300 27/27 [==============================] - 7s 247ms/step - loss: 0.0563 - accuracy: 0.9821 - val_loss: 0.0562 - val_accuracy: 0.9817 Epoch 22/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0549 - accuracy: 0.9824 - val_loss: 0.0550 - val_accuracy: 0.9819 Epoch 23/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0536 - accuracy: 0.9827 - val_loss: 0.0541 - val_accuracy: 0.9820 Epoch 24/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0525 - accuracy: 0.9830 - val_loss: 0.0533 - val_accuracy: 0.9821 Epoch 25/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0515 - accuracy: 0.9832 - val_loss: 0.0525 - val_accuracy: 0.9822 Epoch 26/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0506 - accuracy: 0.9834 - val_loss: 0.0519 - val_accuracy: 0.9823 Epoch 27/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0497 - accuracy: 0.9836 - val_loss: 0.0512 - val_accuracy: 0.9824 Epoch 28/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0489 - accuracy: 0.9838 - val_loss: 0.0506 - val_accuracy: 0.9825 Epoch 29/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0481 - accuracy: 0.9840 - val_loss: 0.0500 - val_accuracy: 0.9826 Epoch 30/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0474 - accuracy: 0.9841 - val_loss: 0.0494 - val_accuracy: 0.9828 Epoch 31/300 27/27 [==============================] - 6s 242ms/step - loss: 0.0466 - accuracy: 0.9843 - val_loss: 0.0487 - val_accuracy: 0.9829 Epoch 32/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0459 - accuracy: 0.9845 - val_loss: 0.0482 - val_accuracy: 0.9830 Epoch 33/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0453 - accuracy: 0.9847 - val_loss: 0.0477 - val_accuracy: 0.9831 Epoch 34/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0447 - accuracy: 0.9848 - val_loss: 0.0472 - val_accuracy: 0.9832 Epoch 35/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0441 - accuracy: 0.9850 - val_loss: 0.0468 - val_accuracy: 0.9833 Epoch 36/300 27/27 [==============================] - 6s 242ms/step - loss: 0.0436 - accuracy: 0.9851 - val_loss: 0.0464 - val_accuracy: 0.9834 Epoch 37/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0432 - accuracy: 0.9852 - val_loss: 0.0460 - val_accuracy: 0.9835 Epoch 38/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0427 - accuracy: 0.9853 - val_loss: 0.0456 - val_accuracy: 0.9836 Epoch 39/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0423 - accuracy: 0.9854 - val_loss: 0.0453 - val_accuracy: 0.9836 Epoch 40/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0419 - accuracy: 0.9855 - val_loss: 0.0450 - val_accuracy: 0.9837 Epoch 41/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0415 - accuracy: 0.9856 - val_loss: 0.0447 - val_accuracy: 0.9837 Epoch 42/300 27/27 [==============================] - 5s 197ms/step - loss: 0.0412 - accuracy: 0.9857 - val_loss: 0.0445 - val_accuracy: 0.9838 Epoch 43/300 27/27 [==============================] - 5s 199ms/step - loss: 0.0408 - accuracy: 0.9858 - val_loss: 0.0442 - val_accuracy: 0.9838 Epoch 44/300 27/27 [==============================] - 5s 197ms/step - loss: 0.0405 - accuracy: 0.9859 - val_loss: 0.0439 - val_accuracy: 0.9839 Epoch 45/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0402 - accuracy: 0.9860 - val_loss: 0.0437 - val_accuracy: 0.9839 Epoch 46/300 27/27 [==============================] - 6s 242ms/step - loss: 0.0399 - accuracy: 0.9860 - val_loss: 0.0434 - val_accuracy: 0.9839 Epoch 47/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0396 - accuracy: 0.9861 - val_loss: 0.0432 - val_accuracy: 0.9840 Epoch 48/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0393 - accuracy: 0.9862 - val_loss: 0.0430 - val_accuracy: 0.9840 Epoch 49/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0390 - accuracy: 0.9863 - val_loss: 0.0428 - val_accuracy: 0.9840 Epoch 50/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0388 - accuracy: 0.9864 - val_loss: 0.0426 - val_accuracy: 0.9841 Epoch 51/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0385 - accuracy: 0.9864 - val_loss: 0.0424 - val_accuracy: 0.9842 Epoch 52/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0382 - accuracy: 0.9865 - val_loss: 0.0422 - val_accuracy: 0.9842 Epoch 53/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0380 - accuracy: 0.9866 - val_loss: 0.0420 - val_accuracy: 0.9842 Epoch 54/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0378 - accuracy: 0.9866 - val_loss: 0.0418 - val_accuracy: 0.9843 Epoch 55/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0375 - accuracy: 0.9867 - val_loss: 0.0416 - val_accuracy: 0.9843 Epoch 56/300 27/27 [==============================] - 7s 253ms/step - loss: 0.0373 - accuracy: 0.9868 - val_loss: 0.0414 - val_accuracy: 0.9843 Epoch 57/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0371 - accuracy: 0.9868 - val_loss: 0.0413 - val_accuracy: 0.9844 Epoch 58/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0369 - accuracy: 0.9869 - val_loss: 0.0411 - val_accuracy: 0.9844 Epoch 59/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0366 - accuracy: 0.9870 - val_loss: 0.0409 - val_accuracy: 0.9844 Epoch 60/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0364 - accuracy: 0.9870 - val_loss: 0.0408 - val_accuracy: 0.9845 Epoch 61/300 27/27 [==============================] - 7s 247ms/step - loss: 0.0362 - accuracy: 0.9871 - val_loss: 0.0406 - val_accuracy: 0.9845 Epoch 62/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0360 - accuracy: 0.9871 - val_loss: 0.0405 - val_accuracy: 0.9845 Epoch 63/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0358 - accuracy: 0.9872 - val_loss: 0.0403 - val_accuracy: 0.9845 Epoch 64/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0356 - accuracy: 0.9873 - val_loss: 0.0402 - val_accuracy: 0.9845 Epoch 65/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0355 - accuracy: 0.9873 - val_loss: 0.0400 - val_accuracy: 0.9846 Epoch 66/300 27/27 [==============================] - 8s 293ms/step - loss: 0.0353 - accuracy: 0.9874 - val_loss: 0.0399 - val_accuracy: 0.9846 Epoch 67/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0351 - accuracy: 0.9874 - val_loss: 0.0398 - val_accuracy: 0.9847 Epoch 68/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0349 - accuracy: 0.9875 - val_loss: 0.0396 - val_accuracy: 0.9847 Epoch 69/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0348 - accuracy: 0.9875 - val_loss: 0.0395 - val_accuracy: 0.9848 Epoch 70/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0346 - accuracy: 0.9876 - val_loss: 0.0394 - val_accuracy: 0.9848 Epoch 71/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0344 - accuracy: 0.9876 - val_loss: 0.0393 - val_accuracy: 0.9848 Epoch 72/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0343 - accuracy: 0.9877 - val_loss: 0.0391 - val_accuracy: 0.9849 Epoch 73/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0341 - accuracy: 0.9877 - val_loss: 0.0390 - val_accuracy: 0.9849 Epoch 74/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0340 - accuracy: 0.9878 - val_loss: 0.0389 - val_accuracy: 0.9849 Epoch 75/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0338 - accuracy: 0.9878 - val_loss: 0.0388 - val_accuracy: 0.9850 Epoch 76/300 27/27 [==============================] - 6s 243ms/step - loss: 0.0337 - accuracy: 0.9879 - val_loss: 0.0387 - val_accuracy: 0.9850 Epoch 77/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0335 - accuracy: 0.9879 - val_loss: 0.0386 - val_accuracy: 0.9850 Epoch 78/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0334 - accuracy: 0.9879 - val_loss: 0.0384 - val_accuracy: 0.9851 Epoch 79/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0333 - accuracy: 0.9880 - val_loss: 0.0383 - val_accuracy: 0.9851 Epoch 80/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0331 - accuracy: 0.9880 - val_loss: 0.0382 - val_accuracy: 0.9851 Epoch 81/300 27/27 [==============================] - 7s 243ms/step - loss: 0.0330 - accuracy: 0.9881 - val_loss: 0.0381 - val_accuracy: 0.9851 Epoch 82/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0328 - accuracy: 0.9881 - val_loss: 0.0380 - val_accuracy: 0.9852 Epoch 83/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0327 - accuracy: 0.9881 - val_loss: 0.0379 - val_accuracy: 0.9852 Epoch 84/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0326 - accuracy: 0.9882 - val_loss: 0.0378 - val_accuracy: 0.9852 Epoch 85/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0324 - accuracy: 0.9882 - val_loss: 0.0377 - val_accuracy: 0.9852 Epoch 86/300 27/27 [==============================] - 7s 247ms/step - loss: 0.0323 - accuracy: 0.9883 - val_loss: 0.0376 - val_accuracy: 0.9852 Epoch 87/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0322 - accuracy: 0.9883 - val_loss: 0.0375 - val_accuracy: 0.9853 Epoch 88/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0321 - accuracy: 0.9883 - val_loss: 0.0374 - val_accuracy: 0.9853 Epoch 89/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0319 - accuracy: 0.9884 - val_loss: 0.0374 - val_accuracy: 0.9853 Epoch 90/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0318 - accuracy: 0.9884 - val_loss: 0.0373 - val_accuracy: 0.9854 Epoch 91/300 27/27 [==============================] - 7s 255ms/step - loss: 0.0317 - accuracy: 0.9884 - val_loss: 0.0372 - val_accuracy: 0.9854 Epoch 92/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0316 - accuracy: 0.9885 - val_loss: 0.0371 - val_accuracy: 0.9854 Epoch 93/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0315 - accuracy: 0.9885 - val_loss: 0.0370 - val_accuracy: 0.9854 Epoch 94/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0314 - accuracy: 0.9885 - val_loss: 0.0369 - val_accuracy: 0.9855 Epoch 95/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0313 - accuracy: 0.9886 - val_loss: 0.0368 - val_accuracy: 0.9855 Epoch 96/300 27/27 [==============================] - 7s 243ms/step - loss: 0.0311 - accuracy: 0.9886 - val_loss: 0.0367 - val_accuracy: 0.9855 Epoch 97/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0310 - accuracy: 0.9887 - val_loss: 0.0367 - val_accuracy: 0.9855 Epoch 98/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0309 - accuracy: 0.9887 - val_loss: 0.0366 - val_accuracy: 0.9856 Epoch 99/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0308 - accuracy: 0.9887 - val_loss: 0.0365 - val_accuracy: 0.9856 Epoch 100/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0307 - accuracy: 0.9887 - val_loss: 0.0364 - val_accuracy: 0.9856 Epoch 101/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0306 - accuracy: 0.9888 - val_loss: 0.0363 - val_accuracy: 0.9856 Epoch 102/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0305 - accuracy: 0.9888 - val_loss: 0.0362 - val_accuracy: 0.9857 Epoch 103/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0304 - accuracy: 0.9888 - val_loss: 0.0362 - val_accuracy: 0.9857 Epoch 104/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0303 - accuracy: 0.9889 - val_loss: 0.0361 - val_accuracy: 0.9857 Epoch 105/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0302 - accuracy: 0.9889 - val_loss: 0.0360 - val_accuracy: 0.9857 Epoch 106/300 27/27 [==============================] - 6s 241ms/step - loss: 0.0301 - accuracy: 0.9889 - val_loss: 0.0359 - val_accuracy: 0.9857 Epoch 107/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0300 - accuracy: 0.9890 - val_loss: 0.0358 - val_accuracy: 0.9858 Epoch 108/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0299 - accuracy: 0.9890 - val_loss: 0.0358 - val_accuracy: 0.9858 Epoch 109/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0298 - accuracy: 0.9890 - val_loss: 0.0357 - val_accuracy: 0.9858 Epoch 110/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0297 - accuracy: 0.9890 - val_loss: 0.0356 - val_accuracy: 0.9858 Epoch 111/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0296 - accuracy: 0.9891 - val_loss: 0.0355 - val_accuracy: 0.9858 Epoch 112/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0295 - accuracy: 0.9891 - val_loss: 0.0355 - val_accuracy: 0.9858 Epoch 113/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0294 - accuracy: 0.9891 - val_loss: 0.0354 - val_accuracy: 0.9859 Epoch 114/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0293 - accuracy: 0.9892 - val_loss: 0.0353 - val_accuracy: 0.9859 Epoch 115/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0292 - accuracy: 0.9892 - val_loss: 0.0353 - val_accuracy: 0.9859 Epoch 116/300 27/27 [==============================] - 7s 243ms/step - loss: 0.0292 - accuracy: 0.9892 - val_loss: 0.0352 - val_accuracy: 0.9859 Epoch 117/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0291 - accuracy: 0.9892 - val_loss: 0.0351 - val_accuracy: 0.9859 Epoch 118/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0290 - accuracy: 0.9893 - val_loss: 0.0350 - val_accuracy: 0.9860 Epoch 119/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0289 - accuracy: 0.9893 - val_loss: 0.0350 - val_accuracy: 0.9860 Epoch 120/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0288 - accuracy: 0.9893 - val_loss: 0.0349 - val_accuracy: 0.9860 Epoch 121/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0287 - accuracy: 0.9893 - val_loss: 0.0348 - val_accuracy: 0.9860 Epoch 122/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0286 - accuracy: 0.9894 - val_loss: 0.0348 - val_accuracy: 0.9860 Epoch 123/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0285 - accuracy: 0.9894 - val_loss: 0.0347 - val_accuracy: 0.9861 Epoch 124/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0284 - accuracy: 0.9894 - val_loss: 0.0346 - val_accuracy: 0.9861 Epoch 125/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0283 - accuracy: 0.9895 - val_loss: 0.0345 - val_accuracy: 0.9861 Epoch 126/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0283 - accuracy: 0.9895 - val_loss: 0.0345 - val_accuracy: 0.9862 Epoch 127/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0282 - accuracy: 0.9895 - val_loss: 0.0344 - val_accuracy: 0.9862 Epoch 128/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0281 - accuracy: 0.9895 - val_loss: 0.0343 - val_accuracy: 0.9862 Epoch 129/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0280 - accuracy: 0.9896 - val_loss: 0.0343 - val_accuracy: 0.9862 Epoch 130/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0279 - accuracy: 0.9896 - val_loss: 0.0342 - val_accuracy: 0.9863 Epoch 131/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0278 - accuracy: 0.9896 - val_loss: 0.0341 - val_accuracy: 0.9863 Epoch 132/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0277 - accuracy: 0.9896 - val_loss: 0.0341 - val_accuracy: 0.9863 Epoch 133/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0277 - accuracy: 0.9897 - val_loss: 0.0340 - val_accuracy: 0.9863 Epoch 134/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0276 - accuracy: 0.9897 - val_loss: 0.0339 - val_accuracy: 0.9864 Epoch 135/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0275 - accuracy: 0.9897 - val_loss: 0.0339 - val_accuracy: 0.9864 Epoch 136/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0274 - accuracy: 0.9897 - val_loss: 0.0338 - val_accuracy: 0.9864 Epoch 137/300 27/27 [==============================] - 5s 198ms/step - loss: 0.0273 - accuracy: 0.9898 - val_loss: 0.0338 - val_accuracy: 0.9864 Epoch 138/300 27/27 [==============================] - 5s 202ms/step - loss: 0.0273 - accuracy: 0.9898 - val_loss: 0.0337 - val_accuracy: 0.9865 Epoch 139/300 27/27 [==============================] - 5s 200ms/step - loss: 0.0272 - accuracy: 0.9898 - val_loss: 0.0337 - val_accuracy: 0.9865 Epoch 140/300 27/27 [==============================] - 5s 200ms/step - loss: 0.0271 - accuracy: 0.9898 - val_loss: 0.0336 - val_accuracy: 0.9865 Epoch 141/300 27/27 [==============================] - 8s 303ms/step - loss: 0.0270 - accuracy: 0.9898 - val_loss: 0.0336 - val_accuracy: 0.9865 Epoch 142/300 27/27 [==============================] - 5s 198ms/step - loss: 0.0269 - accuracy: 0.9899 - val_loss: 0.0335 - val_accuracy: 0.9866 Epoch 143/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0269 - accuracy: 0.9899 - val_loss: 0.0334 - val_accuracy: 0.9866 Epoch 144/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0268 - accuracy: 0.9899 - val_loss: 0.0334 - val_accuracy: 0.9866 Epoch 145/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0267 - accuracy: 0.9900 - val_loss: 0.0333 - val_accuracy: 0.9866 Epoch 146/300 27/27 [==============================] - 7s 253ms/step - loss: 0.0266 - accuracy: 0.9900 - val_loss: 0.0333 - val_accuracy: 0.9867 Epoch 147/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0266 - accuracy: 0.9900 - val_loss: 0.0332 - val_accuracy: 0.9867 Epoch 148/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0265 - accuracy: 0.9900 - val_loss: 0.0332 - val_accuracy: 0.9867 Epoch 149/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0264 - accuracy: 0.9900 - val_loss: 0.0331 - val_accuracy: 0.9867 Epoch 150/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0263 - accuracy: 0.9901 - val_loss: 0.0331 - val_accuracy: 0.9867 Epoch 151/300 27/27 [==============================] - 7s 247ms/step - loss: 0.0263 - accuracy: 0.9901 - val_loss: 0.0330 - val_accuracy: 0.9867 Epoch 152/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0262 - accuracy: 0.9901 - val_loss: 0.0330 - val_accuracy: 0.9868 Epoch 153/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0261 - accuracy: 0.9901 - val_loss: 0.0329 - val_accuracy: 0.9868 Epoch 154/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0261 - accuracy: 0.9902 - val_loss: 0.0329 - val_accuracy: 0.9868 Epoch 155/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0260 - accuracy: 0.9902 - val_loss: 0.0329 - val_accuracy: 0.9868 Epoch 156/300 27/27 [==============================] - 7s 279ms/step - loss: 0.0260 - accuracy: 0.9902 - val_loss: 0.0328 - val_accuracy: 0.9868 Epoch 157/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0259 - accuracy: 0.9902 - val_loss: 0.0328 - val_accuracy: 0.9868 Epoch 158/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0258 - accuracy: 0.9902 - val_loss: 0.0327 - val_accuracy: 0.9869 Epoch 159/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0258 - accuracy: 0.9902 - val_loss: 0.0327 - val_accuracy: 0.9869 Epoch 160/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0257 - accuracy: 0.9903 - val_loss: 0.0327 - val_accuracy: 0.9869 Epoch 161/300 27/27 [==============================] - 6s 243ms/step - loss: 0.0257 - accuracy: 0.9903 - val_loss: 0.0326 - val_accuracy: 0.9869 Epoch 162/300 27/27 [==============================] - 5s 197ms/step - loss: 0.0256 - accuracy: 0.9903 - val_loss: 0.0326 - val_accuracy: 0.9869 Epoch 163/300 27/27 [==============================] - 5s 200ms/step - loss: 0.0255 - accuracy: 0.9903 - val_loss: 0.0325 - val_accuracy: 0.9869 Epoch 164/300 27/27 [==============================] - 5s 201ms/step - loss: 0.0255 - accuracy: 0.9903 - val_loss: 0.0325 - val_accuracy: 0.9869 Epoch 165/300 27/27 [==============================] - 5s 200ms/step - loss: 0.0254 - accuracy: 0.9904 - val_loss: 0.0325 - val_accuracy: 0.9870 Epoch 166/300 27/27 [==============================] - 7s 271ms/step - loss: 0.0254 - accuracy: 0.9904 - val_loss: 0.0324 - val_accuracy: 0.9870 Epoch 167/300 27/27 [==============================] - 5s 197ms/step - loss: 0.0253 - accuracy: 0.9904 - val_loss: 0.0324 - val_accuracy: 0.9870 Epoch 168/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0253 - accuracy: 0.9904 - val_loss: 0.0324 - val_accuracy: 0.9870 Epoch 169/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0252 - accuracy: 0.9904 - val_loss: 0.0323 - val_accuracy: 0.9870 Epoch 170/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0252 - accuracy: 0.9904 - val_loss: 0.0323 - val_accuracy: 0.9870 Epoch 171/300 27/27 [==============================] - 7s 247ms/step - loss: 0.0251 - accuracy: 0.9905 - val_loss: 0.0322 - val_accuracy: 0.9870 Epoch 172/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0251 - accuracy: 0.9905 - val_loss: 0.0322 - val_accuracy: 0.9871 Epoch 173/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0250 - accuracy: 0.9905 - val_loss: 0.0322 - val_accuracy: 0.9871 Epoch 174/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0250 - accuracy: 0.9905 - val_loss: 0.0321 - val_accuracy: 0.9871 Epoch 175/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0249 - accuracy: 0.9905 - val_loss: 0.0321 - val_accuracy: 0.9871 Epoch 176/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0249 - accuracy: 0.9905 - val_loss: 0.0321 - val_accuracy: 0.9871 Epoch 177/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0248 - accuracy: 0.9905 - val_loss: 0.0320 - val_accuracy: 0.9871 Epoch 178/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0248 - accuracy: 0.9906 - val_loss: 0.0320 - val_accuracy: 0.9871 Epoch 179/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0247 - accuracy: 0.9906 - val_loss: 0.0320 - val_accuracy: 0.9871 Epoch 180/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0247 - accuracy: 0.9906 - val_loss: 0.0319 - val_accuracy: 0.9871 Epoch 181/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0247 - accuracy: 0.9906 - val_loss: 0.0319 - val_accuracy: 0.9872 Epoch 182/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0246 - accuracy: 0.9906 - val_loss: 0.0319 - val_accuracy: 0.9872 Epoch 183/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0246 - accuracy: 0.9906 - val_loss: 0.0318 - val_accuracy: 0.9872 Epoch 184/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0245 - accuracy: 0.9906 - val_loss: 0.0318 - val_accuracy: 0.9872 Epoch 185/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0245 - accuracy: 0.9906 - val_loss: 0.0318 - val_accuracy: 0.9872 Epoch 186/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0245 - accuracy: 0.9906 - val_loss: 0.0318 - val_accuracy: 0.9872 Epoch 187/300 27/27 [==============================] - 5s 197ms/step - loss: 0.0244 - accuracy: 0.9907 - val_loss: 0.0317 - val_accuracy: 0.9872 Epoch 188/300 27/27 [==============================] - 5s 200ms/step - loss: 0.0244 - accuracy: 0.9907 - val_loss: 0.0317 - val_accuracy: 0.9872 Epoch 189/300 27/27 [==============================] - 5s 200ms/step - loss: 0.0244 - accuracy: 0.9907 - val_loss: 0.0317 - val_accuracy: 0.9872 Epoch 190/300 27/27 [==============================] - 5s 201ms/step - loss: 0.0243 - accuracy: 0.9907 - val_loss: 0.0317 - val_accuracy: 0.9872 Epoch 191/300 27/27 [==============================] - 7s 270ms/step - loss: 0.0243 - accuracy: 0.9907 - val_loss: 0.0316 - val_accuracy: 0.9872 Epoch 192/300 27/27 [==============================] - 5s 199ms/step - loss: 0.0243 - accuracy: 0.9907 - val_loss: 0.0316 - val_accuracy: 0.9872 Epoch 193/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0243 - accuracy: 0.9907 - val_loss: 0.0316 - val_accuracy: 0.9871 Epoch 194/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0242 - accuracy: 0.9907 - val_loss: 0.0316 - val_accuracy: 0.9871 Epoch 195/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0242 - accuracy: 0.9907 - val_loss: 0.0315 - val_accuracy: 0.9871 Epoch 196/300 27/27 [==============================] - 7s 246ms/step - loss: 0.0242 - accuracy: 0.9907 - val_loss: 0.0315 - val_accuracy: 0.9871 Epoch 197/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0242 - accuracy: 0.9907 - val_loss: 0.0315 - val_accuracy: 0.9871 Epoch 198/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0243 - accuracy: 0.9907 - val_loss: 0.0316 - val_accuracy: 0.9871 Epoch 199/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0243 - accuracy: 0.9907 - val_loss: 0.0316 - val_accuracy: 0.9870 Epoch 200/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0243 - accuracy: 0.9907 - val_loss: 0.0317 - val_accuracy: 0.9869 Epoch 201/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0244 - accuracy: 0.9906 - val_loss: 0.0318 - val_accuracy: 0.9869 Epoch 202/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0246 - accuracy: 0.9906 - val_loss: 0.0321 - val_accuracy: 0.9867 Epoch 203/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0248 - accuracy: 0.9905 - val_loss: 0.0323 - val_accuracy: 0.9865 Epoch 204/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0251 - accuracy: 0.9905 - val_loss: 0.0322 - val_accuracy: 0.9866 Epoch 205/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0254 - accuracy: 0.9904 - val_loss: 0.0315 - val_accuracy: 0.9870 Epoch 206/300 27/27 [==============================] - 7s 246ms/step - loss: 0.0253 - accuracy: 0.9905 - val_loss: 0.0313 - val_accuracy: 0.9872 Epoch 207/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0248 - accuracy: 0.9906 - val_loss: 0.0313 - val_accuracy: 0.9873 Epoch 208/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0245 - accuracy: 0.9907 - val_loss: 0.0312 - val_accuracy: 0.9873 Epoch 209/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0244 - accuracy: 0.9907 - val_loss: 0.0311 - val_accuracy: 0.9874 Epoch 210/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0244 - accuracy: 0.9908 - val_loss: 0.0311 - val_accuracy: 0.9874 Epoch 211/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0243 - accuracy: 0.9908 - val_loss: 0.0312 - val_accuracy: 0.9874 Epoch 212/300 27/27 [==============================] - 5s 198ms/step - loss: 0.0242 - accuracy: 0.9908 - val_loss: 0.0311 - val_accuracy: 0.9874 Epoch 213/300 27/27 [==============================] - 5s 199ms/step - loss: 0.0241 - accuracy: 0.9908 - val_loss: 0.0311 - val_accuracy: 0.9874 Epoch 214/300 27/27 [==============================] - 5s 199ms/step - loss: 0.0241 - accuracy: 0.9909 - val_loss: 0.0311 - val_accuracy: 0.9874 Epoch 215/300 27/27 [==============================] - 5s 197ms/step - loss: 0.0240 - accuracy: 0.9909 - val_loss: 0.0311 - val_accuracy: 0.9874 Epoch 216/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0240 - accuracy: 0.9909 - val_loss: 0.0310 - val_accuracy: 0.9874 Epoch 217/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0239 - accuracy: 0.9909 - val_loss: 0.0310 - val_accuracy: 0.9875 Epoch 218/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0239 - accuracy: 0.9909 - val_loss: 0.0310 - val_accuracy: 0.9875 Epoch 219/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0238 - accuracy: 0.9909 - val_loss: 0.0310 - val_accuracy: 0.9875 Epoch 220/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0237 - accuracy: 0.9910 - val_loss: 0.0309 - val_accuracy: 0.9875 Epoch 221/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0237 - accuracy: 0.9910 - val_loss: 0.0309 - val_accuracy: 0.9875 Epoch 222/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0237 - accuracy: 0.9910 - val_loss: 0.0309 - val_accuracy: 0.9875 Epoch 223/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0236 - accuracy: 0.9910 - val_loss: 0.0309 - val_accuracy: 0.9875 Epoch 224/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0236 - accuracy: 0.9910 - val_loss: 0.0308 - val_accuracy: 0.9875 Epoch 225/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0235 - accuracy: 0.9910 - val_loss: 0.0308 - val_accuracy: 0.9875 Epoch 226/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0235 - accuracy: 0.9911 - val_loss: 0.0308 - val_accuracy: 0.9875 Epoch 227/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0234 - accuracy: 0.9911 - val_loss: 0.0308 - val_accuracy: 0.9875 Epoch 228/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0234 - accuracy: 0.9911 - val_loss: 0.0307 - val_accuracy: 0.9876 Epoch 229/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0233 - accuracy: 0.9911 - val_loss: 0.0307 - val_accuracy: 0.9876 Epoch 230/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0233 - accuracy: 0.9911 - val_loss: 0.0307 - val_accuracy: 0.9876 Epoch 231/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0233 - accuracy: 0.9911 - val_loss: 0.0306 - val_accuracy: 0.9876 Epoch 232/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0232 - accuracy: 0.9911 - val_loss: 0.0306 - val_accuracy: 0.9876 Epoch 233/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0232 - accuracy: 0.9911 - val_loss: 0.0306 - val_accuracy: 0.9876 Epoch 234/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0231 - accuracy: 0.9911 - val_loss: 0.0305 - val_accuracy: 0.9876 Epoch 235/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0231 - accuracy: 0.9912 - val_loss: 0.0305 - val_accuracy: 0.9876 Epoch 236/300 27/27 [==============================] - 8s 288ms/step - loss: 0.0231 - accuracy: 0.9912 - val_loss: 0.0305 - val_accuracy: 0.9876 Epoch 237/300 27/27 [==============================] - 5s 198ms/step - loss: 0.0230 - accuracy: 0.9912 - val_loss: 0.0305 - val_accuracy: 0.9876 Epoch 238/300 27/27 [==============================] - 5s 201ms/step - loss: 0.0230 - accuracy: 0.9912 - val_loss: 0.0305 - val_accuracy: 0.9876 Epoch 239/300 27/27 [==============================] - 5s 200ms/step - loss: 0.0229 - accuracy: 0.9912 - val_loss: 0.0304 - val_accuracy: 0.9877 Epoch 240/300 27/27 [==============================] - 5s 199ms/step - loss: 0.0229 - accuracy: 0.9912 - val_loss: 0.0304 - val_accuracy: 0.9877 Epoch 241/300 27/27 [==============================] - 8s 313ms/step - loss: 0.0228 - accuracy: 0.9912 - val_loss: 0.0303 - val_accuracy: 0.9877 Epoch 242/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0228 - accuracy: 0.9913 - val_loss: 0.0303 - val_accuracy: 0.9877 Epoch 243/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0228 - accuracy: 0.9913 - val_loss: 0.0302 - val_accuracy: 0.9877 Epoch 244/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0227 - accuracy: 0.9913 - val_loss: 0.0302 - val_accuracy: 0.9877 Epoch 245/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0227 - accuracy: 0.9913 - val_loss: 0.0302 - val_accuracy: 0.9878 Epoch 246/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0226 - accuracy: 0.9913 - val_loss: 0.0302 - val_accuracy: 0.9877 Epoch 247/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0226 - accuracy: 0.9913 - val_loss: 0.0302 - val_accuracy: 0.9877 Epoch 248/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0226 - accuracy: 0.9913 - val_loss: 0.0302 - val_accuracy: 0.9877 Epoch 249/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0225 - accuracy: 0.9913 - val_loss: 0.0302 - val_accuracy: 0.9877 Epoch 250/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0225 - accuracy: 0.9913 - val_loss: 0.0302 - val_accuracy: 0.9877 Epoch 251/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0224 - accuracy: 0.9914 - val_loss: 0.0301 - val_accuracy: 0.9878 Epoch 252/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0224 - accuracy: 0.9914 - val_loss: 0.0301 - val_accuracy: 0.9878 Epoch 253/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0223 - accuracy: 0.9914 - val_loss: 0.0301 - val_accuracy: 0.9878 Epoch 254/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0223 - accuracy: 0.9914 - val_loss: 0.0301 - val_accuracy: 0.9878 Epoch 255/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0222 - accuracy: 0.9914 - val_loss: 0.0301 - val_accuracy: 0.9878 Epoch 256/300 27/27 [==============================] - 7s 244ms/step - loss: 0.0222 - accuracy: 0.9914 - val_loss: 0.0300 - val_accuracy: 0.9878 Epoch 257/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0221 - accuracy: 0.9915 - val_loss: 0.0300 - val_accuracy: 0.9878 Epoch 258/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0221 - accuracy: 0.9915 - val_loss: 0.0300 - val_accuracy: 0.9878 Epoch 259/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0220 - accuracy: 0.9915 - val_loss: 0.0300 - val_accuracy: 0.9878 Epoch 260/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0220 - accuracy: 0.9915 - val_loss: 0.0300 - val_accuracy: 0.9879 Epoch 261/300 27/27 [==============================] - 7s 243ms/step - loss: 0.0219 - accuracy: 0.9915 - val_loss: 0.0300 - val_accuracy: 0.9879 Epoch 262/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0219 - accuracy: 0.9915 - val_loss: 0.0300 - val_accuracy: 0.9879 Epoch 263/300 27/27 [==============================] - 5s 199ms/step - loss: 0.0218 - accuracy: 0.9915 - val_loss: 0.0300 - val_accuracy: 0.9879 Epoch 264/300 27/27 [==============================] - 5s 200ms/step - loss: 0.0218 - accuracy: 0.9915 - val_loss: 0.0300 - val_accuracy: 0.9879 Epoch 265/300 27/27 [==============================] - 5s 201ms/step - loss: 0.0217 - accuracy: 0.9916 - val_loss: 0.0300 - val_accuracy: 0.9880 Epoch 266/300 27/27 [==============================] - 7s 246ms/step - loss: 0.0217 - accuracy: 0.9916 - val_loss: 0.0300 - val_accuracy: 0.9880 Epoch 267/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0217 - accuracy: 0.9916 - val_loss: 0.0300 - val_accuracy: 0.9880 Epoch 268/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0216 - accuracy: 0.9916 - val_loss: 0.0300 - val_accuracy: 0.9880 Epoch 269/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0216 - accuracy: 0.9916 - val_loss: 0.0300 - val_accuracy: 0.9880 Epoch 270/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0215 - accuracy: 0.9916 - val_loss: 0.0300 - val_accuracy: 0.9880 Epoch 271/300 27/27 [==============================] - 7s 245ms/step - loss: 0.0215 - accuracy: 0.9916 - val_loss: 0.0300 - val_accuracy: 0.9880 Epoch 272/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0215 - accuracy: 0.9916 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 273/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0214 - accuracy: 0.9917 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 274/300 27/27 [==============================] - 5s 194ms/step - loss: 0.0214 - accuracy: 0.9917 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 275/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0214 - accuracy: 0.9917 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 276/300 27/27 [==============================] - 6s 243ms/step - loss: 0.0213 - accuracy: 0.9917 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 277/300 27/27 [==============================] - 5s 197ms/step - loss: 0.0213 - accuracy: 0.9917 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 278/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0213 - accuracy: 0.9917 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 279/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0212 - accuracy: 0.9917 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 280/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0212 - accuracy: 0.9917 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 281/300 27/27 [==============================] - 7s 246ms/step - loss: 0.0212 - accuracy: 0.9917 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 282/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0211 - accuracy: 0.9918 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 283/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0211 - accuracy: 0.9918 - val_loss: 0.0300 - val_accuracy: 0.9881 Epoch 284/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0211 - accuracy: 0.9918 - val_loss: 0.0299 - val_accuracy: 0.9881 Epoch 285/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0210 - accuracy: 0.9918 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 286/300 27/27 [==============================] - 7s 243ms/step - loss: 0.0210 - accuracy: 0.9918 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 287/300 27/27 [==============================] - 5s 198ms/step - loss: 0.0210 - accuracy: 0.9918 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 288/300 27/27 [==============================] - 5s 199ms/step - loss: 0.0210 - accuracy: 0.9918 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 289/300 27/27 [==============================] - 5s 200ms/step - loss: 0.0209 - accuracy: 0.9918 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 290/300 27/27 [==============================] - 5s 201ms/step - loss: 0.0209 - accuracy: 0.9918 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 291/300 27/27 [==============================] - 7s 247ms/step - loss: 0.0209 - accuracy: 0.9918 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 292/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0208 - accuracy: 0.9918 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 293/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0208 - accuracy: 0.9919 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 294/300 27/27 [==============================] - 5s 196ms/step - loss: 0.0208 - accuracy: 0.9919 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 295/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0207 - accuracy: 0.9919 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 296/300 27/27 [==============================] - 7s 246ms/step - loss: 0.0207 - accuracy: 0.9919 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 297/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0207 - accuracy: 0.9919 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 298/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0207 - accuracy: 0.9919 - val_loss: 0.0299 - val_accuracy: 0.9882 Epoch 299/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0206 - accuracy: 0.9919 - val_loss: 0.0299 - val_accuracy: 0.9883 Epoch 300/300 27/27 [==============================] - 5s 195ms/step - loss: 0.0206 - accuracy: 0.9919 - val_loss: 0.0299 - val_accuracy: 0.9882
## Save the model at the latest EPOCH or as desired
model.save(f"/content/drive/MyDrive/final/saved_models_Unet/model_{EPOCHS}.h5")
MODEL_PATH = "/content/drive/MyDrive/final/saved_models_Unet/model_295.h5" #Change this to the model path you want to load
model.load_weights(MODEL_PATH, by_name=True)
import sys
np.set_printoptions(threshold=sys.maxsize)
#Pick first batch of Image from Validation set
for image, mask in dataset['val'].take(1):
sample_image, sample_mask = image, mask
#Pick first Prediction Validation set
sample_idx = 2
pred_mask = model.predict(sample_image)
sample_image = sample_image.numpy()[sample_idx] #Pick first image form a batch of 5
sample_image = (sample_image*255.0).astype(np.uint32)
#Ground Truth Mask
sample_mask = sample_mask.numpy()[sample_idx]
sample_mask = np.squeeze(sample_mask, axis =-1)
#Predicted Mask
pred_mask = pred_mask[sample_idx] #Pick first mask form a batch of 5
print(sample_image.shape)
print(pred_mask.shape)
(256, 256, 3) (256, 256, 2)
pred_mask = np.argmax(pred_mask, axis =-1)
#pred_mask = np.expand_dims(pred_mask, axis =-1)
print(sample_image.shape)
print(pred_mask.shape)
(256, 256, 3) (256, 256)
colors = visualize.random_colors(10)
color = colors[0]
print(color)
masked_image = sample_image.astype(np.uint32).copy()
masked_image = visualize.apply_mask(masked_image, pred_mask, color)
visualize.display_images([masked_image])
(1.0, 0.0, 0.5999999999999996)
# Vizualize Ground Truth
#GT
colors = visualize.random_colors(10)
color = colors[0]
print(color)
masked_image = sample_image.astype(np.uint32).copy()
print(masked_image.shape)
print(sample_mask.shape)
masked_image = visualize.apply_mask(masked_image, sample_mask, color)
visualize.display_images([masked_image])
(0.0, 0.40000000000000036, 1.0) (256, 256, 3) (256, 256)
import pprint
import numpy as np
np.set_printoptions(threshold=sys.maxsize)
count = 0
# for image, mask in dataset['val'].take(1):
# sample_image, sample_mask = image, mask
for image, mask in dataset['val']:
if count > 4:
break
sample_image, sample_mask = image, mask
#Pick first Prediction Validation set
sample_idx = 3
pred_mask = model.predict(sample_image)
sample_image = sample_image.numpy()[sample_idx] #Pick first image form a batch of 5
sample_image = (sample_image*255.0).astype(np.uint32)
#Ground Truth Mask
sample_mask = sample_mask.numpy()[sample_idx]
sample_mask = np.squeeze(sample_mask, axis =-1)
#Predicted Mask
pred_mask = pred_mask[sample_idx] #Pick first mask form a batch of 5
pred_mask = np.argmax(pred_mask, axis =-1)
colors = visualize.random_colors(10)
color = colors[0]
color2 = colors[1]
Input_image = sample_image.astype(np.uint32).copy()
True_Mask = sample_image.astype(np.uint32).copy()
Pred_Mask = sample_image.astype(np.uint32).copy()
True_Mask = visualize.apply_mask(True_Mask, sample_mask, color2)
Pred_Mask = visualize.apply_mask(Pred_Mask, pred_mask, color)
#visualize.display_images([masked_image])
display_sample([Input_image,True_Mask,Pred_Mask])
count += 1
count = 0
avg_pixel = []
avg_IOU = []
for image, mask in dataset['val']:
if count > 4:
break
sample_image, sample_mask = image, mask
#Pick first Prediction Validation set
sample_idx = 3
pred_mask = model.predict(sample_image)
sample_image = sample_image.numpy()[sample_idx] #Pick first image form a batch of 5
sample_image = (sample_image*255.0).astype(np.uint32)
#Ground Truth Mask
sample_mask = sample_mask.numpy()[sample_idx]
sample_mask = np.squeeze(sample_mask, axis =-1)
print
#Predicted Mask
pred_mask = pred_mask[sample_idx] #Pick first mask form a batch of 5
pred_mask = np.argmax(pred_mask, axis =-1)
true = copy.deepcopy(sample_mask)
pred = copy.deepcopy(pred_mask)
intersection = np.logical_and(sample_mask, pred_mask)
union = np.logical_or(sample_mask, pred_mask)
iou_score = np.sum(intersection) / np.sum(union)
avg_IOU.append(iou_score)
print("IOU: " + str(iou_score))
# True Positive (TP): we predict a label of 1 (positive), and the true label is 1.
TP = np.sum(np.logical_and(pred == 1, true == 1))
# True Negative (TN): we predict a label of 0 (negative), and the true label is 0.
TN = np.sum(np.logical_and(pred == 0, true == 0))
# False Positive (FP): we predict a label of 1 (positive), but the true label is 0.
FP = np.sum(np.logical_and(pred == 1, true == 0))
# False Negative (FN): we predict a label of 0 (negative), but the true label is 1.
FN = np.sum(np.logical_and(pred == 0, true == 1))
pixel_accuracy = (TP+TN)/(TP+FP+TN+FN)
print("pixel_accuracy: " +str(pixel_accuracy))
avg_pixel.append(pixel_accuracy)
count += 1
# False Positive (FP): we predict a label of 1 (positive), but the true label is 0.
FP = np.sum(np.logical_and(pred == 1, true == 0))
# False Negative (FN): we predict a label of 0 (negative), but the true label is 1.
FN = np.sum(np.logical_and(pred == 0, true == 1))
pixel_accuracy = (TP+TN)/(TP+FP+TN+FN)
print("pixel_accuracy: " +str(pixel_accuracy))
avg_pixel.append(pixel_accuracy)
count += 1
IOU: 0.425531914893617 pixel_accuracy: 0.987640380859375 pixel_accuracy: 0.987640380859375 IOU: 0.4202247191011236 pixel_accuracy: 0.996063232421875 pixel_accuracy: 0.996063232421875 IOU: 0.5535307517084282 pixel_accuracy: 0.99700927734375 pixel_accuracy: 0.99700927734375
print("Average Pixel Accuracy: " + str(sum(avg_pixel)/len(avg_pixel)))
print("Average IOU: " + str(sum(avg_IOU)/len(avg_IOU)))
Average Pixel Accuracy: 0.9935709635416666 Average IOU: 0.46642912856772295